#include "to_mp4.h"
#include<QImageReader>
#include<QRegExp>
#include<QThread>

//int chishu=0;
//图片


to_mp4::to_mp4(QObject *parent):QObject(parent)
{

    this->width=1280;
    this->height=720;

}

to_mp4::~to_mp4()
{

}

void to_mp4::setfont()
{
    QSqlDatabase fontback;
    if(QSqlDatabase::contains("qt_sql_default_connection"))
      fontback = QSqlDatabase::database("qt_sql_default_connection");
    else
      fontback = QSqlDatabase::addDatabase("QSQLITE");
    fontback.setDatabaseName("../myshujuku.db");

    if(fontback.open()==true)
    {
        QSqlQuery query;//不可以做成员,会报错
        query.exec("select * from fontandback");
        if(query.first()==true)
        {

            this->qttomp4font=query.value(7).toString();qDebug()<<"to_mp4::setfont"<<this->qttomp4font;
            this->filename_back=query.value(8).toString();qDebug()<<filename_back;
            this->filename_logo=query.value(9).toString();qDebug()<<filename_logo;
            this->rgb_r=query.value(1).toInt();qDebug()<<rgb_r;
            this->rgb_g=query.value(2).toInt();qDebug()<<rgb_g;
            this->rgb_b=query.value(3).toInt();qDebug()<<rgb_b;
            this->rgb_r_lo=query.value(4).toInt();qDebug()<<rgb_r_lo;
            this->rgb_g_lo=query.value(5).toInt();qDebug()<<rgb_g_lo;
            this->rgb_b_lo=query.value(6).toInt();qDebug()<<rgb_b_lo;
        }
     fontback.close();
    }

    if(rgb_r<0||rgb_g<0||rgb_b<0)
    {
        //QImageReader reader(this->filename_back);//背景图
        QImageReader reader(this->filename_back);//":/new/prefix3/背景图.png"
        //reader.setScaledSize(QSize(1280,720));
        reader.read(&imgchuyuan);
        this->width=imgchuyuan.width();qDebug()<< imgchuyuan.width();
        this->height=imgchuyuan.height();qDebug()<< imgchuyuan.height();
    }
    else {

        QColor imgcolor(rgb_r,rgb_g,rgb_b);
        imgchuyuan=QImage(1280,720,QImage::Format_RGB888);
        imgchuyuan.fill(imgcolor);
        this->width=1280;
        this->height=720;
    }

}

void to_mp4::setother()
{
    //不要放在构造函数,连续使用的保证
    this->yunxinnum=0;
    this->yunxinbef=-1;
    //
    QSqlDatabase mysql;
    if(QSqlDatabase::contains("qt_sql_default_connection"))
       mysql = QSqlDatabase::database("qt_sql_default_connection");
    else
      mysql = QSqlDatabase::addDatabase("QSQLITE");
    mysql.setDatabaseName("../myshujuku.db");

    //
    if(mysql.open()==true)
    {
         QSqlQuery query;
         query.exec("select * from title_filename");
         if(query.first()==true)
         {
             this->filename_logo=query.value("title").toString();//标题

             QString engfilename;
             engfilename=query.value("filename").toString();
             //时长//最大行数
             //this->time_length=this->gettimelen(engfilename);
             this->time_length=this->gettimelen_bysql();

             this->outFilename=query.value("outfilename").toString();

             //
             this->trans_id=query.value("trans_id").toInt();

             this->kaiqi_text_2=query.value("text_2").toUInt();

             ce_subtitle_stop=query.value("ce_stop").toBool();

         }

         mysql.close();
    }



    return;
}
//生成视频的时间
double to_mp4::gettimelen(QString path_txt)
{
    QFile txt(path_txt);
    QByteArray arr[4];

    if(txt.open(QIODevice::ReadOnly))
    {
        while(txt.atEnd()==false)
        {
            for(int i=0;i<4;i++)
            {
                arr[i]=txt.readLine();
                qDebug()<<"gettimelen(QString path_txt) "<<QString( arr[i] );
            }
        }
    txt.close();
    }
    else
    {
        qDebug()<<"打开txt失败";
    }

//最大行数
    QString tempstr(arr[0]);
    this->maxyunxin=tempstr.toInt();

//    char test[]="00:02:17,420 --> 00:02:31,600";
//    char*iiii=test;
    char* p=arr[1].data();
    double time=0;

    double time_3;
//3
    for(int i=0;i<=9;i++)
    {
        if(p[26]==QString("%1").arg(i))
            time_3=0.1*i;

    }
  //2
    double time_2[2];
    for(int i=0;i<=9;i++)
    {
        if(p[23]==QString("%1").arg(i))
            time_2[0]=10*i;

    }
    for(int i=0;i<=9;i++)
    {
        if(p[24]==QString("%1").arg(i))
            time_2[1]=i;

    }
    //1
    double time_1[2];
    for(int i=0;i<=9;i++)
    {
        if(p[20]==QString("%1").arg(i))
            time_1[0]=10*i*60;

    }
    for(int i=0;i<=9;i++)
    {
        if(p[21]==QString("%1").arg(i))
            time_1[1]=i*60;

    }

    time=time_3+time_2[0]+time_2[1]+time_1[0]+time_1[1];

    return time;
}

double to_mp4::gettimelen_bysql()
{
    double time=0;

    //数据库:
    QSqlDatabase mysql;
    if(QSqlDatabase::contains("qt_sql_default_connection"))
      mysql = QSqlDatabase::database("qt_sql_default_connection");
    else
      mysql = QSqlDatabase::addDatabase("QSQLITE");
    mysql.setDatabaseName("../myshujuku_engchi.db");
    //查找数据库
    if(mysql.open()==true)
    {
        QSqlQuery query(mysql);

        //英语
        query.exec(QString("select * from english "));
        while (query.next())
        {
            time=query.value("time").toDouble();
            this->maxyunxin=query.value("id").toInt();
        }
        mysql.close();
    }


    return time;
}

void to_mp4::change_jp(QByteArray arrtxt)
{

    qDebug()<<"trans_id="<<trans_id;
    if(trans_id==3)
    {
        size_egl=12;
    }

    QString temp=arrtxt;
    int len=temp.length();//qDebug()<<"len"<<len;
//    char test[]="与传统的制动技术相比，汽车中的马达将汽车";
//    char(*ttt)=test;
    int base=43;
  //是否分段
  if(len<=base)
  {
      this->NEWtxt=arrtxt;//QByteArray,to,qstring?
      return;
  }
  if(len>base&&len<=base*2)
  {
      this->NEWtxt=temp.insert(len/2,'\n');
      return;
  }
  if(len>base*2&&len<=base*3)
  {
      temp=temp.insert(len/3,'\n');
      temp=temp.insert(len/3*2,'\n');
      this->NEWtxt=temp;
      return;
  }
  if(len>base*3&&len<=base*4)
  {
      temp=temp.insert(len/4,'\n');
      temp=temp.insert(len/4*2,'\n');
      temp=temp.insert(len/4*3,'\n');
      this->NEWtxt=temp;
      return;
  }
  if(len>base*4&&len<=base*5)
  {
      temp=temp.insert(len/5,'\n');
      temp=temp.insert(len/5*2,'\n');
      temp=temp.insert(len/5*3,'\n');
      temp=temp.insert(len/5*4,'\n');
      this->NEWtxt=temp;
      return;
  }
  if(len>base*5&&len<=base*6)
  {
      temp=temp.insert(len/6,'\n');
      temp=temp.insert(len/6*2,'\n');
      temp=temp.insert(len/6*3,'\n');
      temp=temp.insert(len/6*4,'\n');
      temp=temp.insert(len/6*5,'\n');
      this->NEWtxt=temp;
      return;
  }
  if(len>base*6&&len<=base*7)
  {
      temp=temp.insert(len/7,'\n');
      temp=temp.insert(len/7*2,'\n');
      temp=temp.insert(len/7*3,'\n');
      temp=temp.insert(len/7*4,'\n');
      temp=temp.insert(len/7*5,'\n');
      temp=temp.insert(len/7*6,'\n');
      this->NEWtxt=temp;
      return;
  }
  if(len>base*7&&len<=base*8)
  {
      temp=temp.insert(len/8,'\n');
      temp=temp.insert(len/8*2,'\n');
      temp=temp.insert(len/8*3,'\n');
      temp=temp.insert(len/8*4,'\n');
      temp=temp.insert(len/8*5,'\n');
      temp=temp.insert(len/8*6,'\n');
      temp=temp.insert(len/8*7,'\n');
      this->NEWtxt=temp;
      return;
  }
  if(len>base*8&&len<=base*9)
  {
      for(int i=1;i<9;i++)
      {
          temp=temp.insert(len/9*i,'\n');
      }
      this->NEWtxt=temp;
      return;
  }
  if(len>base*9&&len<=base*10)
  {
      for(int i=1;i<10;i++)
      {
          temp=temp.insert(len/10*i,'\n');
      }
      this->NEWtxt=temp;
      return;
  }
  if(len>base*10&&len<=base*11)
  {
      for(int i=1;i<11;i++)
      {
          temp=temp.insert(len/11*i,'\n');
      }
      this->NEWtxt=temp;
      return;
  }
  if(len>base*11&&len<=base*12)
  {
      for(int i=1;i<12;i++)
      {
          temp=temp.insert(len/12*i,'\n');
      }
      this->NEWtxt=temp;
      return;
  }
  if(len>base*12&&len<=base*13)
  {
      for(int i=1;i<13;i++)
      {
          temp=temp.insert(len/13*i,'\n');
      }
      this->NEWtxt=temp;
      return;
  }
  if(len>base*13&&len<=base*14)
  {
      for(int i=1;i<14;i++)
      {
          temp=temp.insert(len/14*i,'\n');
      }
      this->NEWtxt=temp;
      return;
  }
  if(len>base*14&&len<=base*15)
  {
      for(int i=1;i<15;i++)
      {
          temp=temp.insert(len/15*i,'\n');
      }
      this->NEWtxt=temp;
      return;
  }
  if(len>base*15&&len<=base*16)
  {
      for(int i=1;i<16;i++)
      {
          temp=temp.insert(len/16*i,'\n');
      }
      this->NEWtxt=temp;
      return;
   }
  if(len>base*16)
  {
      for(int i=1;i<17;i++)
      {
          temp=temp.insert(len/17*i,'\n');
      }
      this->NEWtxt=temp;
      return;
   }

  //不满足以上条件
  this->NEWtxt=arrtxt;
}

double to_mp4::gettime(int yunxinnum)
{
    //qDebug()<<"double to_mp4::gettime(int yunxinnum)";
    if(yunxinnum==yunxinbef)
    {
        return this->temp_time;
    }

    if(yunxinnum>maxyunxin)
    {
        return this->time_length+2;
    }

    double temp=0;
    //查找数据库
    //数据库:
    QSqlDatabase mysql;
    if(QSqlDatabase::contains("qt_sql_default_connection"))
      mysql = QSqlDatabase::database("qt_sql_default_connection");
    else
      mysql = QSqlDatabase::addDatabase("QSQLITE");
    mysql.setDatabaseName("../myshujuku_engchi.db");

    if(mysql.open()==true)
    {
        QSqlQuery query;
        query.exec(QString("select * from english where id = %1").arg(yunxinnum));
        if(query.first()==true)
        {
            temp=query.value("time").toDouble();
        }
        else
        {
            qDebug()<<"query.first142失败";
        }
        //guanbi
        mysql.close();
    }
    else
    {
        qDebug()<<"打开数据库失败";
    }

    //guanbi
    mysql.close();

    //这次变上次
    this->yunxinbef=yunxinnum;

    return temp;
}

void to_mp4::sqlgetstr(int yunxinnum)
{
    if(yunxinnum>maxyunxin)
    {
        return;
    }
    //数据库:
    QSqlDatabase mysql;
    if(QSqlDatabase::contains("qt_sql_default_connection"))
      mysql = QSqlDatabase::database("qt_sql_default_connection");
    else
      mysql = QSqlDatabase::addDatabase("QSQLITE");
    mysql.setDatabaseName("../myshujuku_engchi.db");
    //查找数据库
    if(mysql.open()==true)
    {
        QSqlQuery query(mysql);
        QString sqleng;
        QString sqlchi;
        //英语
        query.exec(QString("select * from english where id = %1").arg(yunxinnum));
        if(query.first()==true)
        {
            qDebug()<<"yunxinnum="<<yunxinnum
                   <<"time"<<this->temp_time;

            sqleng=query.value("eng").toString();qDebug()<<sqleng;
            qDebug()<<"transid="<<trans_id;
            if(trans_id==3||trans_id==0)//换行
            {
                this->change_jp(sqleng.toUtf8());
            }
            else if(trans_id== 2)
            {
               this->changehang(sqleng.toUtf8());
            }
            else if(trans_id==1)
            {
                 this->changehang_chi(sqleng.toUtf8());
            }
        }
        else
        {
            qDebug()<<"query.first174失败";
        }


        //中文
        query.exec(QString("select * from chinese where id = %1").arg(yunxinnum));
        if(query.first()==true)
        {
            sqlchi=query.value("chi").toString();qDebug()<<sqlchi;
           this->changehang_chi(sqlchi.toUtf8());
        }
        else
        {
            qDebug()<<"query.first184失败";
        }
        //guanbi
        mysql.close();
    }
    else
    {
        qDebug()<<"打开数据库失败";
    }

    //guanbi
    mysql.close();
}

double to_mp4::totime(QByteArray arrtime)
{
    QString buf_time(arrtime);
    char* p=buf_time.toUtf8().data();
    double time=0;

    double time_3;
//3
    for(int i=0;i<=9;i++)
    {
        if(p[9]==QString("%1").arg(i))
            time_3=0.1*i;

    }
//2
    double time_2[2];
    for(int i=0;i<=9;i++)
    {
        if(p[6]==QString("%1").arg(i))
            time_2[0]=10*i;

    }
    for(int i=0;i<=9;i++)
    {
        if(p[7]==QString("%1").arg(i))
            time_2[1]=i;

    }
    //1
    double time_1[2];
    for(int i=0;i<=9;i++)
    {
        if(p[3]==QString("%1").arg(i))
            time_1[0]=10*i*60;

    }
    for(int i=0;i<=9;i++)
    {
        if(p[4]==QString("%1").arg(i))
            time_1[1]=i*60;

    }

    time=time_3+time_2[0]+time_2[1]+time_1[0]+time_1[1];

    return time;
}

//英语
void to_mp4::changehang(QByteArray arrtxt)
{

    QString txt(arrtxt);
    char *q=txt.toUtf8().data();
    int len=txt.length();
    int len2=len/2;
//    QString p="六番会社で男の人と女の人が話しています男の人はこの後まず何をしなければなりませんか過剰田中さんから電話がありまして熱があって今日はお休みだそうですあそう最近忙しかったからああ明日田中さんと二人でヒカリ電機の会議に出てもらうことになってましたねその準備はどうなってますか私の方の準備は終わっています田中さんは家でやるって言ってましたそうじゃあ田中さんに電話して書類ができているかどうかちょっと聞いてみてくださいもし円だったらすぐに準備してもらえますかはいそれから明日こられそうかどうかも聞いてみてもらえますか無理そうだったらわりけど一人で行ってくださいねはいわかりましたうん";

//是否分段
    if(len<=60)
    {
        this->NEWtxt=txt;
        return;
    }

    if(len>60&&len<=140)
    {
        char arr2[400];
        char*pp=q;
        for(int i=0;i<399;i++)
        {
            arr2[i]=pp[0];
            pp++;
        }
        arr2[399]='\0';
    //pos
        char temp=arr2[len2];
        int pos=0;
        //char(*parr)[100]=&arr2;
        while (temp!=' ')
        {
            pos++;
            temp=arr2[len2+pos];
        }
        //qDebug()<<pos;
        arr2[len2+pos]='\n';
        //qDebug()<<arr2;

        this->NEWtxt=arr2;//qDebug()<<this->NEWtxt;
        return;
    }
    if(len>140&&len<=210)
    {

        char arr2[400];
        char*pp=q;
        for(int i=0;i<399;i++)
        {
            arr2[i]=pp[0];
            pp++;
        }
        arr2[399]='\0';
    //空格中
        char temp=arr2[len2];
        int pos=0;
        while (temp!=' ')
        {
            pos++;
            temp=arr2[len2+pos];
        }
        //qDebug()<<pos;
        arr2[len2+pos]='\n';
        //qDebug()<<arr2;

     //空格before
        temp=arr2[len/4];
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=arr2[len/4+pos];
        }
        arr2[len/4+pos]='\n';
     //空格after
        temp=arr2[len2+len/4];
        pos=0;
        while(temp!=' ')
        {
            pos++;
            temp=arr2[len2+len/4+pos];
        }
        arr2[len2+len/4+pos]='\n';

        this->NEWtxt=arr2;//qDebug()<<this->NEWtxt;
        return;
    }

    if(len>210&&len<=280)
    {
        int len=txt.length();
        QString temp=txt.mid(len/6,1);
        int pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/6+pos,1);
        }
        txt=txt.insert(len/6+pos,'\n');

        temp=txt.mid(len/6*2,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/6*2+pos,1);
        }
        txt=txt.insert(len/6*2+pos,'\n');

        temp=txt.mid(len/6*3,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/6*3+pos,1);
        }
        txt=txt.insert(len/6*3+pos,'\n');

        temp=txt.mid(len/6*4,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/6*4+pos,1);
        }
        txt=txt.insert(len/6*4+pos,'\n');

        temp=txt.mid(len/6*5,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/6*5+pos,1);
        }
        txt=txt.insert(len/6*5+pos,'\n');

        this->NEWtxt=txt;
        return;
    }

    if(len>280)
    {
        int len=txt.length();
        QString temp=txt.mid(len/7,1);
        int pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/7+pos,1);
        }
        txt=txt.insert(len/7,'\n');

        temp=txt.mid(len/7*2,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/7*2+pos,1);
        }
        txt=txt.insert(len/7*2+pos,'\n');

        temp=txt.mid(len/7*3,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/7*3+pos,1);
        }
        txt=txt.insert(len/7*3+pos,'\n');

        temp=txt.mid(len/7*4,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/7*4+pos,1);
        }
        txt=txt.insert(len/7*4+pos,'\n');

        temp=txt.mid(len/7*5,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/7*5+pos,1);
        }
        txt=txt.insert(len/7*5+pos,'\n');

        temp=txt.mid(len/7*6,1);
        pos=0;
        while (temp!=' ') {
            pos++;
            temp=txt.mid(len/7*6+pos,1);
        }
        txt=txt.insert(len/7*6+pos,'\n');
        this->NEWtxt=txt;
        return;
    }

}

void to_mp4::changehang_chi(QByteArray arrchinese)
{
    if(trans_id==3)
    {
        size_egl=12;
    }


      QString temp=arrchinese;
      int len=temp.length();//qDebug()<<"len"<<len;
//    char test[]="与传统的制动技术相比，汽车中的马达将汽车";
//    char(*ttt)=test;
    //是否分段
      int base=42;
    if(len<=base)
    {
        this->NEWchi=arrchinese;//QByteArray,to,qstring?
        return;
    }
    if(len>base&&len<=base*2)
    {
        this->NEWchi=temp.insert(len/2,'\n');
        return;
    }
    if(len>=base*2&&len<=base*3)
    {
        temp=temp.insert(len/3,'\n');
        temp=temp.insert(len/3*2,'\n');
        this->NEWchi=temp;
        return;
    }
    if(len>=base*3&&len<=base*4)
    {
        temp=temp.insert(len/4,'\n');
        temp=temp.insert(len/4*2,'\n');
        temp=temp.insert(len/4*3,'\n');
        this->NEWchi=temp;
        return;
    }
    if(len>base*4&&len<=base*5)
    {
        temp=temp.insert(len/5,'\n');
        temp=temp.insert(len/5*2,'\n');
        temp=temp.insert(len/5*3,'\n');
        temp=temp.insert(len/5*4,'\n');
        this->NEWchi=temp;
        return;
    }
    if(len>base*5&&len<=base*6)
    {
        temp=temp.insert(len/6,'\n');
        temp=temp.insert(len/6*2,'\n');
        temp=temp.insert(len/6*3,'\n');
        temp=temp.insert(len/6*4,'\n');
        temp=temp.insert(len/6*5,'\n');
        this->NEWchi=temp;
        return;
    }
    if(len>base*6&&len<=base*7)
    {
        temp=temp.insert(len/7,'\n');
        temp=temp.insert(len/7*2,'\n');
        temp=temp.insert(len/7*3,'\n');
        temp=temp.insert(len/7*4,'\n');
        temp=temp.insert(len/7*5,'\n');
        temp=temp.insert(len/7*6,'\n');
        this->NEWchi=temp;
        return;
    }
    if(len>base*7&&len<=base*8)
    {
        temp=temp.insert(len/8,'\n');
        temp=temp.insert(len/8*2,'\n');
        temp=temp.insert(len/8*3,'\n');
        temp=temp.insert(len/8*4,'\n');
        temp=temp.insert(len/8*5,'\n');
        temp=temp.insert(len/8*6,'\n');
        temp=temp.insert(len/8*7,'\n');
        this->NEWchi=temp;
        return;
    }
    if(len>base*8&&len<=base*9)
    {
        for(int i=1;i<9;i++)
        {
            temp=temp.insert(len/9*i,'\n');
        }
        this->NEWchi=temp;
        return;
    }
    if(len>base*9&&len<=base*10)
    {
        for(int i=1;i<10;i++)
        {
            temp=temp.insert(len/10*i,'\n');
        }
        this->NEWchi=temp;
        return;
    }
    if(len>base*10&&len<=base*11)
    {
        for(int i=1;i<11;i++)
        {
            temp=temp.insert(len/11*i,'\n');
        }
        this->NEWchi=temp;
        return;
    }

    if(len>base*11)
    {
        for(int i=1;i<12;i++)
        {
            temp=temp.insert(len/12*i,'\n');
        }
        this->NEWchi=temp;
        return;
    }
    //不满足以上条件
    this->NEWchi=arrchinese;
}

void to_mp4::pngTomp4_2()         //png图集转mp4
{
    qDebug()<<outFilename;
    qDebug()<<time_length;
    qDebug()<<maxyunxin;
    qDebug()<<"已进入pngtomp4";

    if(outFilename.isEmpty())   return;

//    AVFormatContext *kAVFormatContext=NULL;
//    AVOutputFormat *kAVOutputFormat = new AVOutputFormat ();

//    AVCodecContext *kAVCodecContext = nullptr;
//    AVDictionary *kAVDictionary = NULL;
//    AVDictionary *opt = NULL;
//    AVCodec *video_codec=nullptr;
//    AVStream *kAVStream=nullptr;
//    AVFrame *frame=nullptr;
//    AVFrame *tmp_frame=nullptr;
//    AVPacket kAVPacket = { 0 };
//    struct SwsContext *kSwsContext=nullptr;
//    AVRational time{1,24};  /*1s25帧*/
//    AVRational time_1{1,1};  /*1s25帧*/
//    uint8_t *intBuffer = 0;                           // 图片数据缓冲区
//    int ret;
//    int got_packer = 0;
//    int64_t next_pts = 0;

    tmp_frame = av_frame_alloc();
    av_init_packet(&kAVPacket);
    av_register_all();     //1、注册所有容易和编解码器

    /* 2、分配输出媒体上下文 */
    avformat_alloc_output_context2(&kAVFormatContext, NULL, NULL, outFilename.toLocal8Bit().data());      //上下文结构体、输出结构体、文件类型、路径

    if(!kAVFormatContext)        //如果根据文件名没有找到对应的格式则默认mpeg格式
    {
        ret = avformat_alloc_output_context2(&kAVFormatContext, NULL, "mpeg",  outFilename.toLocal8Bit().data());    //没有找到文件类型默认mpeg（MP4）
    }
    if(!kAVOutputFormat) { goto end;}

    kAVOutputFormat = kAVFormatContext->oformat;    //把输出操作结构体赋值出来

    if (!(kAVOutputFormat->flags & AVFMT_NOFILE))   /* 如果需要，打开输出文件*/
    {
        ret = avio_open(&kAVFormatContext->pb, outFilename.toLocal8Bit().data(), AVIO_FLAG_WRITE);  //3、打开输出文件
        if (ret < 0) {qDebug()<<"打开输出文件失败。"<<ret; }
    }


    /* 使用默认格式的编解码器添加音频和视频流，并初始化编解码器。*/
    if (kAVOutputFormat->video_codec != AV_CODEC_ID_NONE)
    {
        video_codec = avcodec_find_encoder(kAVOutputFormat->video_codec);   //4、找到编码器
        if(!video_codec)    goto end;
        kAVStream = avformat_new_stream(kAVFormatContext,NULL);         //5、新建一个输出流
        if(!kAVStream) {qDebug()<<"创建流kAVStream失败。";goto end;}
        kAVCodecContext = avcodec_alloc_context3(video_codec);      //初始化一个AVCodecContext
        if(!kAVCodecContext)    {qDebug()<<"用编码器video_codec初始化的kAVCodecContext默认参数失败";goto end;}

        switch(video_codec->type)
        {
        case AVMEDIA_TYPE_VIDEO:

            kAVCodecContext->codec_id = video_codec->id;
            kAVCodecContext->bit_rate = 800000;
            kAVCodecContext->width = this->width;
            kAVCodecContext->height = this->height;
            kAVStream->time_base = time;
            kAVCodecContext->time_base = time;
            kAVCodecContext->gop_size = 12; /*最多每十二帧发射一个内帧 */
            kAVCodecContext->pix_fmt = AV_PIX_FMT_YUV420P;
            if (kAVCodecContext->codec_id == AV_CODEC_ID_MPEG2VIDEO)
            {
                kAVCodecContext->max_b_frames = 2;  /*为了测试，我们还添加了b帧*/
            }
            if (kAVCodecContext->codec_id == AV_CODEC_ID_MPEG1VIDEO)
            {
                /* 需要避免使用一些coeffs溢出的宏块。这在正常的视频中不会发生，
                 * 只是在色度平面的运动与luma平面不匹配时才会发生。 */
                kAVCodecContext->mb_decision = 2;
            }

            break;
        case AVMEDIA_TYPE_AUDIO:
            break;

        default:
            break;
        }

        if(kAVOutputFormat->flags & AVFMT_GLOBALHEADER)/*有些格式希望流标头是单独的*/
        {
            kAVCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
        }
    }
    av_dict_copy(&opt,kAVDictionary, 0);
    ret = avcodec_open2(kAVCodecContext,video_codec,&opt);      //6、打开编码器
    if(ret<0){qDebug()<<"打开视频编解码器失败"<<ret; goto end;}
    av_dict_free(&opt);
    frame = av_frame_alloc();
    if(!frame)  {qDebug()<<"分配帧失败."; goto end;}
    frame->format = kAVCodecContext->pix_fmt;
    frame->width = kAVCodecContext->width;
    frame->height = kAVCodecContext->height;
    ret = av_frame_get_buffer(frame, 32);   //分配内存空间frame必须要有上三条件，32也就是4字节对齐
    if(ret < 0){qDebug()<<"frame分配内存失败"; goto end;}
    ret = avcodec_parameters_from_context(kAVStream->codecpar,kAVCodecContext);/*将流参数复制到muxer */
    if (ret < 0) {qDebug()<<"无法复制流参数";goto end; }
    av_dump_format(kAVFormatContext, 0, outFilename.toLocal8Bit().data(), 1);     //打印输出文件的详细信息
    ret = avformat_write_header(kAVFormatContext,&kAVDictionary);/* 7、写流标头(如果有的话)*/
    if(ret < 0){qDebug()<<"写流标题失败"; goto end;}


    //8、写入每一帧数据
    for(int i = 0; ; i++)
    {
        if(av_compare_ts(next_pts, kAVCodecContext->time_base, this->time_length, time_1) >= 0)      /*这里只生成10s的视频*/
        {
            qDebug()<<"暂时不需要生成新的帧"; break;
        }
        //时间
        this->temp_time=this->gettime(this->yunxinnum);//qDebug()<<"temp_time="<<temp_time;qDebug()<<"yunxinnum="<<yunxinnum;

        //是否到时间添加字幕
        if(av_compare_ts(next_pts, kAVCodecContext->time_base,  temp_time, time_1) >=0)
        {
            //qDebug()<<"yunxinnum="<<yunxinnum;
//          qDebug()<<"maxyun="<<maxyunxin;
            //qDebug()<<"time="<<temp_time;

            size_egl=19;//字号

            //从数据库得到文本qstring//换行 this.newtxt
            this->sqlgetstr(yunxinnum);

            //得到文本后再++
            this->yunxinnum++;

            //覆盖之前内容

            if(rgb_r<0||rgb_g<0||rgb_b<0)//背景图
            {
                //size_egl=10;//字号
                QImageReader reader(this->filename_back);//":/new/prefix3/背景图.png"
                reader.setScaledSize(QSize(this->width,this->height));
                reader.read(&imgchuyuan);
            }
            else {
                //size_egl=10;//字号

                QColor imgcolor(rgb_r,rgb_g,rgb_b);
                imgchuyuan=QImage(1280,720,QImage::Format_RGB888);
                imgchuyuan.fill(imgcolor);

            }

            //写字
            qDebug()<<"正在添加新字幕";
            QColor pencolor(rgb_r_lo,rgb_g_lo,rgb_b_lo);
            QPen pen(pencolor);//字色
            QFont font(this->qttomp4font,size_egl,false);//字体
            font.setBold(false);

            QPainter painter(&imgchuyuan);
            painter.setPen(pen);
            painter.setFont(font);

            qDebug()<<"kaiqi_text_2="<<kaiqi_text_2;


            NEWtxt= NEWtxt.replace("华研外语：www.TopwayEnglish.com","精听");
            NEWtxt= NEWtxt.replace("华研外语","");
            NEWtxt= NEWtxt.replace("www.TopwayEnglish.com","");
            NEWchi= NEWchi.replace("华研外语：www.TopwayEnglish.com","精听");

            if(kaiqi_text_2==1)//正常双字幕
            {
                //画内容

                //中英字幕保留风格
                qDebug()<<"ce_subtitle_stop"<<ce_subtitle_stop;
                if(trans_id==2&&ce_subtitle_stop==true)
                {

                    engstr.append(NEWtxt+"\n");
                    chistr.append(NEWchi+"\n");
                    danchi_2=(engstr+"\n"+chistr);

                    if(yunxinnum%(4)==0)
                    {
                        engstr.clear();
                        chistr.clear();
                        engstr.append(NEWtxt+"\n");
                        chistr.append(NEWchi+"\n");
                        danchi_2=(engstr+"\n"+chistr);
                    }

                    //
                    QFont font(this->qttomp4font,15,false);//字体
                    font.setBold(false);
                    painter.setFont(font);

                    painter.drawLine(QPoint(0,(height-25)/2),QPoint(width,(height-25)/2));
                    QRect egl(0,25,this->width,this->height-25);
                    painter.drawText(egl,Qt::AlignCenter,this->danchi_2);


                }
                else {//正常风格

                    QRect egl(0,0,this->width,this->height*(0.6));
                    painter.drawText(egl,Qt::AlignCenter,this->NEWtxt);

                    QRect chi(0,this->height*(0.6),this->width,this->height*(0.4));
                    painter.drawText(chi,Qt::AlignTop|Qt::AlignHCenter,this->NEWchi);
                }

            }
            else if(kaiqi_text_2==2)//单行字幕
            {

                //
                painter.drawLine(QPoint(width/2,0),QPoint(width/2,height));

                QFont font(this->qttomp4font,11,false);//字体
                font.setBold(false);
                painter.setFont(font);
                painter.drawText(QPoint(10,20),"精听up:奋斗吧!少年!");
                QRect rect(0,0,this->width/2,this->height);

                if(trans_id== 2)//英语单词模式
                {
                   QFont font(this->qttomp4font,15,false);//字体
                   font.setBold(false);
                   painter.setFont(font);

                   //保留区
                   if(yunxinnum%11==0)
                   {
                       danchi_1=danchi_2;
                       danchi_2.clear();
                   }

                   danchi_2=danchi_2.append(NEWtxt+"\n");
                   painter.drawText(rect,Qt::AlignCenter,this->danchi_2);//英


                   QRect rect_before(width/2,0,this->width/2,this->height);
                   QFont font_before(this->qttomp4font,15,false);//字体
                   font.setBold(false);
                   painter.setFont(font_before);
                   painter.drawText(rect_before,Qt::AlignCenter,danchi_1);


                }
                else if(trans_id==1)//只有中文
                {
                    QFont font(this->qttomp4font,40,false);//字体
                    font.setBold(true);
                    painter.drawText(rect,Qt::AlignCenter,this->NEWchi);//中
                }

                 qDebug()<<"newtxt="<<NEWtxt;
            }

            //顶部标题
            QFont fonttit(this->qttomp4font,20,false);//字体
            fonttit.setBold(false);
            painter.setFont(fonttit);
            painter.drawText(imgchuyuan.rect(),Qt::AlignTop|Qt::AlignHCenter,this->filename_logo);

            emit singal_newchi(QString("正在制作视频...\n"+this->NEWtxt),temp_time);

        }//if()


        if (av_frame_make_writable(frame) < 0)  {goto end;}  /*当我们传递一个帧给编码器时，它可能会在内部保留一个对它的引用;确保我们没有在这里覆盖它*/

//img

        if(imgchuyuan.isNull()){qDebug()<<"打开图片失败";break;}
        imgchuyuan = imgchuyuan.convertToFormat(QImage::Format_RGB888);

        kSwsContext = sws_getContext(kAVCodecContext->width,kAVCodecContext->height,
                                     AV_PIX_FMT_RGB24,kAVCodecContext->width,kAVCodecContext->height,
                                     AV_PIX_FMT_YUV420P,SWS_LANCZOS | SWS_ACCURATE_RND,NULL,NULL,NULL);
        if(!kSwsContext){qDebug()<<"无法初始化图片转换器";    goto end;}


        intBuffer = (uint8_t*)malloc(sizeof(uint8_t)*imgchuyuan.bytesPerLine()*imgchuyuan.height());
        memcpy(intBuffer,imgchuyuan.constBits(),sizeof(uint8_t)*imgchuyuan.bytesPerLine()*imgchuyuan.height());
        avpicture_fill((AVPicture *)tmp_frame,intBuffer,AV_PIX_FMT_RGB24,kAVCodecContext->width,kAVCodecContext->height); //pAVFrame32的data指针指向了outBuffer

        sws_scale(kSwsContext,(const uint8_t * const *)tmp_frame->data,
                  tmp_frame->linesize,0,kAVCodecContext->height,frame->data,frame->linesize);   //图片信息转换
        sws_freeContext(kSwsContext);
        kSwsContext = 0;

        frame->pts = next_pts++;
        //frame->pts = i*(kAVStream->time_base.den)/((kAVStream->time_base.num)*24);

        got_packer = 0;
        //替代
        ret = avcodec_encode_video2(kAVCodecContext,&kAVPacket,frame,&got_packer);  //8、编码、把一帧数据编码成AVPacket
        if(ret < 0) {qDebug()<<"错误编码视频帧"<<ret; goto end;}

        if(got_packer)
        {
            av_packet_rescale_ts(&kAVPacket, kAVCodecContext->time_base, kAVStream->time_base);
            kAVPacket.stream_index = kAVStream->index;
            ret = av_write_frame(kAVFormatContext, &kAVPacket); /*将压缩帧写入媒体文件。 */
            av_free_packet(&kAVPacket);
        }else
        {ret = 0;}
        free(intBuffer);intBuffer = 0;
        if(ret<0){ qDebug()<<"写入video文件失败"<<ret<<kAVPacket.stream_index; break; }
    }

    /*  选择写预告片，如果有的话。预告片必须在你之前写好 当你写标题时关闭CodecContexts打开;否则
        av_write_trailer()可以尝试使用被释放的内存  av_codec_close()。要编码的流 */
        av_write_trailer(kAVFormatContext);

end:
    /* 关闭每个编解码器。 */
    avcodec_free_context(&kAVCodecContext);
    av_frame_free(&frame);

    if (!(kAVOutputFormat->flags & AVFMT_NOFILE))
        avio_closep(&kAVFormatContext->pb);/*关闭输出文件*/

    avformat_free_context(kAVFormatContext);   /*释放上下文*/
}

